/**
 * 路由权限验证工具
 * 提供路由权限检查、用户权限验证等功能
 */

import { ElMessage } from 'element-plus'
import { getUserMenuPermissions } from '../api/permission'

// 权限验证结果类型
export interface PermissionResult {
  hasPermission: boolean
  message?: string
}

// 路由权限配置类型
export interface RoutePermission {
  path: string
  permission?: string
  requiresAuth: boolean
}

/**
 * 检查用户是否有访问指定路由的权限
 * @param routePath 路由路径
 * @param userPermissions 用户权限列表
 * @returns 权限验证结果
 */
export const checkRoutePermission = (
  routePath: string,
  userPermissions: string[]
): PermissionResult => {
  // 如果路由不需要权限验证，直接通过
  if (!requiresPermission(routePath)) {
    return { hasPermission: true }
  }

  if (userPermissions.length === 0) {
    return {
      hasPermission: false,
      message: `您没有访问 ${routePath} 的权限`
    }
  }

  // 检查用户是否有对应权限
  const hasPermission = userPermissions.some((permission) => {
    // 检查权限路径是否匹配
    if (permission === routePath) {
      return true
    }
    // 检查权限代码是否匹配（用于特殊权限）
    if (permission === '*' || permission === 'admin') {
      return true
    }
    // 检查权限路径是否包含路由路径（用于父级权限）
    if (permission.includes(routePath)) {
      return true
    }
    return false
  })

  if (!hasPermission) {
    return {
      hasPermission: false,
      message: `您没有访问 ${routePath} 的权限`
    }
  }

  return { hasPermission: true }
}

/**
 * 检查路由是否需要权限验证
 * @param routePath 路由路径
 * @returns 是否需要权限验证
 */
export const requiresPermission = (routePath: string): boolean => {
  // 不需要权限验证的路由
  const publicRoutes = ['/', '/login', '/Main']
  
  if (publicRoutes.includes(routePath)) {
    return false
  }

  // 所有其他路由都需要权限验证
  return true
}

/**
 * 清除用户权限数据
 */
export const clearUserPermissions = (): void => {
  localStorage.removeItem('userPermissions')
  console.log('已清除用户权限数据')
}

/**
 * 检查用户权限数据
 */
export const checkUserPermissions = (): any[] | null => {
  const storedPermissions = localStorage.getItem('userPermissions')
  if (storedPermissions) {
    try {
      return JSON.parse(storedPermissions)
    } catch (error) {
      console.error('解析权限数据失败:', error)
      localStorage.removeItem('userPermissions')
    }
  }
  return null
}

/**
 * 获取用户权限列表
 * @returns Promise<string[]> 用户权限列表
 */
export const getUserPermissions = async (): Promise<string[]> => {
  try {
    // 优先从本地存储获取权限（登录时保存的）
    const storedPermissions = localStorage.getItem('userPermissions')
    if (storedPermissions) {
      try {
        const permissions = JSON.parse(storedPermissions)
        
        // 提取权限路径列表
        const permissionPaths = permissions.map((p: any) => {
          // 尝试两种可能的字段名
          return p.PermissionPath || p.permissionPath
        }).filter(Boolean)

        if (permissionPaths.length > 0) {
          return permissionPaths
        }
      } catch (error) {
        console.error('解析本地权限数据失败:', error)
        localStorage.removeItem('userPermissions')
      }
    }

    // 如果本地没有权限数据，从API获取
    const response = await getUserMenuPermissions()

    if (response.data.code === 200) {
      // 从菜单权限中提取路由权限
      const permissions = extractPermissionsFromMenu(response.data.data)
      return permissions
    }
    return []
  } catch (error) {
    console.error('获取用户权限失败:', error)
    return []
  }
}

/**
 * 从菜单数据中提取权限列表
 * @param menuData 菜单数据
 * @returns 权限列表
 */
const extractPermissionsFromMenu = (menuData: any[]): string[] => {
  const permissions: string[] = []
  
  const extractFromItem = (item: any) => {
    // 检查两种可能的字段名
    const permissionCode = item.PermissionCode || item.permissionCode
    const permissionPath = item.PermissionPath || item.permissionPath
    const permissionName = item.PermissionName || item.permissionName
    
    // 根据RBAC表设计，权限相关字段
    if (permissionCode) {
      permissions.push(permissionCode)
    }
    if (permissionPath) {
      permissions.push(permissionPath)
    }
    if (permissionName) {
      permissions.push(permissionName)
    }
    // 兼容其他可能的字段名
    if (item.permission) {
      permissions.push(item.permission)
    }
    if (item.path) {
      permissions.push(item.path)
    }
    if (item.children) {
      item.children.forEach(extractFromItem)
    }
  }
  
  menuData.forEach(extractFromItem)
  return permissions
}

/**
 * 路由权限守卫
 * 在路由跳转前检查权限
 * @param to 目标路由
 * @param from 来源路由
 * @param userPermissions 用户权限列表
 * @returns 是否允许跳转
 */
export const routePermissionGuard = async (
  to: any,
  from: any,
  userPermissions: string[]
): Promise<boolean> => {
  // 检查是否需要权限验证
  if (!requiresPermission(to.path)) {
    return true
  }

  // 检查权限
  const result = checkRoutePermission(to.path, userPermissions)
  
  if (!result.hasPermission) {
    ElMessage.warning(result.message || '您没有访问此页面的权限')
    return false
  }

  return true
}

/**
 * 权限验证装饰器
 * 用于组件方法的权限验证
 * @param permission 需要的权限
 * @returns 装饰器函数
 */
export const requirePermission = (permission: string) => {
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value

    descriptor.value = async function (...args: any[]) {
      const userPermissions = await getUserPermissions()
      
      if (!userPermissions.includes(permission)) {
        ElMessage.warning('您没有执行此操作的权限')
        return
      }

      return originalMethod.apply(this, args)
    }

    return descriptor
  }
}

/**
 * 检查用户是否为管理员
 * @param userPermissions 用户权限列表
 * @returns 是否为管理员
 */
export const isAdmin = (userPermissions: string[]): boolean => {
  return userPermissions.includes('admin') || userPermissions.includes('*')
}

/**
 * 检查用户是否有特定权限
 * @param permission 权限名称
 * @param userPermissions 用户权限列表
 * @returns 是否有权限
 */
export const hasPermission = (permission: string, userPermissions: string[]): boolean => {
  return userPermissions.includes(permission) || isAdmin(userPermissions)
}

/**
 * 权限验证错误处理
 * @param error 错误对象
 */
export const handlePermissionError = (error: any) => {
  console.error('权限验证错误:', error)
  
  if (error.response?.status === 401) {
    ElMessage.error('登录已过期，请重新登录')
    // 清除本地存储的token
    localStorage.removeItem('token')
    localStorage.removeItem('userNickname')
    localStorage.removeItem('roleName')
    localStorage.removeItem('departmentName')
    // 跳转到登录页
    window.location.href = '/'
  } else if (error.response?.status === 403) {
    ElMessage.error('您没有访问此资源的权限')
  } else {
    ElMessage.error('权限验证失败，请稍后重试')
  }
}
